package com.hpeng.search.service;


import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;

/**
 *   基于ssh 框架的分页器
 * @author 卢闯 lc7777777@gmail.com
 *
 */
public class Page {

	private int pageSize=10;//默认一页显示10 条数据
	private int tatalPage=0;//总页数
	private int startRow;//对应数据库里的行数
	private int currntPage=1;//当前页数
	private String ClassName="";//类名要和 表名一致
	private List Result=null; // 执行得到的结果集


	//构造器 实例化
	public Page(String ClassName)
	{
		this.ClassName=ClassName;
		this.tatalPage=this.getTatalPage(ClassName);
	}
	private String ExcuCoutSql(String ClassName,int state)
	{
		return state==0?"select count(*) from "+ClassName:"select * from "+ClassName;

	}
	/**
	 * 获得数据库里对应开去取的的行数
	 * @return
	 */
	public int getStartRow()
	{
		this.startRow=(this.currntPage-1)*this.pageSize;
		return this.startRow;
	}
	//下一页
	private void next()
	{
		if(this.currntPage==this.tatalPage)
			return;
		this.currntPage++;

	}
	//首页
	private void firstPage()
	{
		this.currntPage=1;
	}
	//刷新操作
	private void Refresh()
	{
		firstPage();
	}
	//末页操作
	private void endPage()
	{
		this.currntPage=this.tatalPage;
	}
	//上一页
	private void back()
	{

		if(this.currntPage==1)
			return;
		this.currntPage--;
	}
	//执行 hql 语句取得分页的结果集
	private List getObjectByHql(String hql)
	{
		Session session =this.getSession();
		this.Result=session.createQuery(hql).setFirstResult(this.getStartRow()).setMaxResults(this.pageSize).list();
		session.flush();
		return this.Result;
	}
	/**
	 * 获得 总页数
	 * @param tableName
	 * @return
	 */
	private int getTatalPage(String tableName)
	{
		Session ss=this.getSession(); 
		int count=((Integer)ss.createQuery(this.ExcuCoutSql(tableName,0)).iterate().next()).intValue();
		//第二中方法
		//count=Integer.parseInt(ss.createQuery(this.ExcuCoutSql(tableName,0)).uniqueResult().toString());
		ss.flush();
		return count;
	}
	/**
	 * 获得当前页的总行数
	 * @return
	 */
	public int getResultRowCount()
	{
		return (this.Result==null)?0:this.Result.size();
	}
	/**
	 * 判断是否是 首页
	 * @return
	 */
	public boolean isFistPage()
	{
		return this.currntPage==1;
	}
	/**
	 * 判断是否是 末页
	 * @return
	 */
	public boolean isEndPage()
	{
		return this.currntPage==this.tatalPage;
	}
	/**
	 * 分页执行的 入口方法 
	 * @param Contidion=first(首页)，end(末页),next(下一页),back(上一页)，Refresh(刷新)
	 * @return
	 */
	public List ConmandResultByCondition(String Contidion)
	{
		if(Contidion.equals("first"))
		{
			this.firstPage();
		}else if(Contidion.equals("end"))
		{
			this.endPage();
		}else if(Contidion.equals("next"))
		{
			this.next();
		}else if(Contidion.equals("back"))
		{
			this.back();
		}else
		{
			this.Refresh();
		}
		return this.getObjectByHql(this.ExcuCoutSql(this.ClassName,1));
	}
	/**
	 * 获得执行的session
	 * //获得总数 实体类名不能传错了 通过实体类 操作它对应的数据库里的表 此处传的是类名
	 * @return
	 */
	private Session getSession()
	{
		Session session=null;
		try {
			session=new Configuration().addClass(Class.forName(ClassName)).buildSessionFactory().openSession();
		} catch (MappingException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		} catch (HibernateException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
			System.out.print("hiberbate 出现了异常");
		} catch (ClassNotFoundException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
			System.out.print("类名不存在");
		} 
		return session;
	}

	//获得页面大小
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

}
